home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / OldSrc / CH10 / SRC / SPARSE1.CLS < prev    next >
Text File  |  1996-05-04  |  9KB  |  318 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "ObjSparseGrid"
  6. Attribute VB_Creatable = False
  7. Attribute VB_Exposed = False
  8. Option Explicit
  9.  
  10. Private grid As ObjGrid3D   ' The display grid.
  11.  
  12. Private NumPts As Integer   ' # actual data values.
  13. Private Data() As Point3D   ' Actual data values.
  14.  
  15. Private ShowData As Boolean ' Draw the actual data?
  16.  
  17. ' ************************************************
  18. ' Find the data point closest to the desired
  19. ' location.
  20. ' ************************************************
  21. Sub FindNearestPoint(x As Single, z As Single, best_i As Integer)
  22. Dim i As Integer
  23. Dim best_dist2 As Single
  24. Dim diffx As Single
  25. Dim diffz As Single
  26. Dim dist2 As Single
  27.  
  28.     ' Start with the first data point.
  29.     best_i = 0
  30.     best_dist2 = 1000000
  31.     
  32.     ' See which points are closer.
  33.     For i = 1 To NumPts
  34.         ' See if this point is closer than the ones
  35.         ' already chosen.
  36.         diffx = x - Data(i).coord(1)
  37.         diffz = z - Data(i).coord(3)
  38.         dist2 = diffx * diffx + diffz * diffz
  39.         If dist2 < best_dist2 Then
  40.             best_i = i
  41.             best_dist2 = dist2
  42.         End If
  43.     Next i
  44. End Sub
  45.  
  46.  
  47.  
  48.  
  49. ' ************************************************
  50. ' Create the grid values for display.
  51. '
  52. ' dx and dz tell how far apart to make the grid
  53. ' lines.
  54. ' ************************************************
  55. Public Sub InitializeGrid(Dx As Single, Dz As Single)
  56. Dim Xmin As Single
  57. Dim Xmax As Single
  58. Dim Zmin As Single
  59. Dim Zmax As Single
  60. Dim NumX As Integer
  61. Dim NumZ As Integer
  62. Dim wid As Single
  63. Dim hgt As Single
  64. Dim i As Integer
  65. Dim j As Integer
  66. Dim x As Single
  67. Dim y As Single
  68. Dim z As Single
  69. Dim best_i As Integer
  70.  
  71.     ' Find the X and Z data bounds.
  72.     Xmin = Data(1).coord(1)
  73.     Xmax = Xmin
  74.     Zmin = Data(1).coord(3)
  75.     Zmax = Zmin
  76.     For i = 2 To NumPts
  77.         If Xmin > Data(i).coord(1) Then Xmin = Data(i).coord(1)
  78.         If Xmax < Data(i).coord(1) Then Xmax = Data(i).coord(1)
  79.         If Zmin > Data(i).coord(3) Then Zmin = Data(i).coord(3)
  80.         If Zmax < Data(i).coord(3) Then Zmax = Data(i).coord(3)
  81.     Next i
  82.  
  83.     ' Set the data boundaries.
  84.     wid = Xmax - Xmin
  85.     hgt = Zmax - Zmin
  86.     NumX = wid / Dx + 1
  87.     NumZ = hgt / Dz + 1
  88.     x = (wid - NumX * Dx) / 2
  89.     z = (hgt - NumZ * Dz) / 2
  90.     Xmin = Xmin - x
  91.     Xmax = Xmax + x
  92.     Zmin = Zmin - z
  93.     Zmax = Zmax + z
  94.     
  95.     ' Create the new grid object.
  96.     Set grid = New ObjGrid3D
  97.     grid.SetBounds Xmin, Dx, NumX, Zmin, Dz, NumZ
  98.  
  99.     ' Fill in data values.
  100.     x = Xmin
  101.     For i = 1 To NumX
  102.         z = Zmin
  103.         For j = 1 To NumZ
  104.             ' Find the closest data value.
  105.             FindNearestPoint x, z, best_i
  106.         
  107.             ' Add the value to the grid.
  108.             grid.SetValue x, Data(best_i).coord(2), z
  109.             z = z + Dz
  110.         Next j
  111.         x = x + Dx
  112.     Next i
  113. End Sub
  114.  
  115.  
  116. ' ************************************************
  117. ' Set a data value.
  118. ' ************************************************
  119. Sub SetValue(x As Single, y As Single, z As Single)
  120.     NumPts = NumPts + 1
  121.     ReDim Preserve Data(1 To NumPts)
  122.     Data(NumPts).coord(1) = x
  123.     Data(NumPts).coord(2) = y
  124.     Data(NumPts).coord(3) = z
  125.     Data(NumPts).coord(4) = 1#
  126. End Sub
  127. ' ***********************************************
  128. ' Return a string indicating the object type.
  129. ' ***********************************************
  130. Property Get ObjectType() As String
  131.     ObjectType = "SPARSE_GRID"
  132. End Property
  133.  
  134.  
  135.  
  136. ' ***********************************************
  137. ' Fix the data coordinates at their transformed
  138. ' values.
  139. ' ***********************************************
  140. Public Sub FixPoints()
  141. Dim i As Integer
  142. Dim j As Integer
  143.     
  144.     ' Fix the grid points if the grid exists.
  145.     If Not grid Is Nothing Then grid.FixPoints
  146.  
  147.     ' Fix the original data.
  148.     For i = 1 To NumPts
  149.         For j = 1 To 3
  150.             Data(i).coord(j) = Data(i).trans(j)
  151.         Next j
  152.     Next i
  153. End Sub
  154.  
  155. ' ************************************************
  156. ' Apply a transformation matrix which may not
  157. ' contain 0, 0, 0, 1 in the last column to the
  158. ' object.
  159. ' ************************************************
  160. Public Sub ApplyFull(M() As Single)
  161. Dim i As Integer
  162.     
  163.     ' Apply the matrix to the grid if it exists.
  164.     If Not grid Is Nothing Then grid.ApplyFull M
  165.  
  166.     ' Apply the matrix to the sparse data.
  167.     For i = 1 To NumPts
  168.         m3ApplyFull Data(i).coord, M, Data(i).trans
  169.     Next i
  170. End Sub
  171.  
  172. ' ************************************************
  173. ' Apply a transformation matrix to the object.
  174. ' ************************************************
  175. Public Sub Apply(M() As Single)
  176. Dim i As Integer
  177.     
  178.     ' Apply the matrix to the grid if it exists.
  179.     If Not grid Is Nothing Then grid.Apply M
  180.  
  181.     ' Apply the matrix to the sparse data.
  182.     For i = 1 To NumPts
  183.         m3Apply Data(i).coord, M, Data(i).trans
  184.     Next i
  185. End Sub
  186.  
  187.  
  188. ' ************************************************
  189. ' Apply a nonlinear transformation.
  190. ' ************************************************
  191. Public Sub Distort(D As Object)
  192. Dim i As Integer
  193.     
  194.     ' Distort the grid if it exists.
  195.     If Not grid Is Nothing Then grid.Distort D
  196.  
  197.     ' Distort the sparse data.
  198.     For i = 1 To NumPts
  199.         D.Distort Data(i).coord(1), Data(i).coord(2), Data(i).coord(3)
  200.     Next i
  201. End Sub
  202.  
  203. ' ************************************************
  204. ' Write the sparse grid's grid object to a file
  205. ' using Write. The data can later be loaded into
  206. ' an ObjGrid3D object but not an ObjSparseGrid
  207. ' object.
  208. ' ************************************************
  209. Public Sub FileWriteGrid(filenum As Integer)
  210.     If Not grid Is Nothing Then grid.FileWrite filenum
  211. End Sub
  212.  
  213.  
  214.  
  215. ' ************************************************
  216. ' Write a sparse grid to a file using Write.
  217. ' Begin with "SPARSE_GRID" to identify this object.
  218. ' ************************************************
  219. Public Sub FileWrite(filenum As Integer)
  220. Dim i As Integer
  221.  
  222.     ' Write basic information.
  223.     Write #filenum, "SPARSE_GRID", NumPts
  224.         
  225.     ' Write the data.
  226.     For i = 1 To NumPts
  227.         Write #filenum, Data(i).coord(1), _
  228.             Data(i).coord(2), Data(i).coord(3)
  229.     Next i
  230.     
  231.     ' Write grid spacing information.
  232.     If grid Is Nothing Then
  233.         Write #filenum, 0, 0
  234.     Else
  235.         Write #filenum, grid.DeltaX, grid.DeltaZ
  236.     End If
  237. End Sub
  238.  
  239.  
  240.  
  241.  
  242. ' ************************************************
  243. ' Draw the transformed points on a Form, Printer,
  244. ' or PictureBox.
  245. ' ************************************************
  246. Public Sub Draw(canvas As Object, Optional R As Variant)
  247. Dim i As Integer
  248.     
  249.     ' Draw the grid if it exists.
  250.     If Not grid Is Nothing Then grid.Draw canvas, R
  251.  
  252.     ' Draw the original data points if desired.
  253.     If ShowData Then
  254.         On Error Resume Next
  255.         For i = 1 To NumPts
  256.             canvas.Line (Data(i).trans(1) - 2, Data(i).trans(2) - 2)-Step(4, 4), vbRed
  257.             canvas.Line (Data(i).trans(1) + 2, Data(i).trans(2) - 2)-Step(-4, 4), vbRed
  258.         Next i
  259.     End If
  260. End Sub
  261.  
  262.  
  263. ' ************************************************
  264. ' Read a sparse grid from a file using Input.
  265. ' Assume the "SPARSE_GRID" label has already been
  266. ' read.
  267. ' ************************************************
  268. Public Sub FileInput(filenum As Integer)
  269. Dim i As Integer
  270. Dim Dx As Single
  271. Dim Dz As Single
  272.  
  273.     ' Get the basic information.
  274.     Input #filenum, NumPts
  275.     
  276.     ' Allocate the Data array.
  277.     ReDim Data(1 To NumPts)
  278.     
  279.     ' Read the data.
  280.     For i = 1 To NumPts
  281.         Input #filenum, Data(i).coord(1), _
  282.             Data(i).coord(2), Data(i).coord(3)
  283.     Next i
  284.     
  285.     ' Read grid spacing information.
  286.     Input #filenum, Dx, Dz
  287.     
  288.     ' Initialize the grid data.
  289.     If Dx = 0 Then
  290.         Set grid = Nothing
  291.     Else
  292.         InitializeGrid Dx, Dz
  293.     End If
  294. End Sub
  295.  
  296.  
  297. ' ************************************************
  298. ' Tell the user whether we're drawing the data.
  299. ' ************************************************
  300. Property Get ShowTrueData() As Boolean
  301.     ShowTrueData = ShowData
  302. End Property
  303.  
  304. ' ************************************************
  305. ' Let the user decide whether we should draw the
  306. ' actual data.
  307. ' ************************************************
  308. Property Let ShowTrueData(value As Boolean)
  309.     ShowData = value
  310. End Property
  311.  
  312.  
  313. Private Sub Class_Initialize()
  314.     Set grid = Nothing
  315. End Sub
  316.  
  317.  
  318.